package com.example.kotlinstudy.s7

//单例一句搞定  1饿汉式
object KSington

//https://www.bilibili.com/video/BV1xE411v72E?from=search&seid=13964240757455870965
//单例一句搞定  2饿汉式
class KSington2 private constructor() {
    companion object {
        private var instance: KSington2? = null
            get() {
                if (field == null) {
                    field = KSington2()
                }
                return field
            }

        fun get(): KSington2 {  //KSington2?  反回不能加？   加了，说明可以为空
            return instance!!  //但是instance又是可为空类型，所以只有强转~为不可空类型，他本身不是空的所以是安全的
        }
    }
}

//  3 线程安全的饿汉式
class KSington3 private constructor() {
    companion object {
        private var instance: KSington3? = null
            get() {
                if (field == null) {
                    field = KSington3()
                }
                return field
            }

        @Synchronized //加锁
        fun get(): KSington3 {  //KSington2?  反回不能加？   加了，说明可以为空
            return instance!!  //但是instance又是可为空类型，所以只有强转~为不可空类型，他本身不是空的所以是安全的
        }
    }
}

//4 双重检测 线程安全的饿汉式
class KSington4 private constructor() {
    fun plus(s: Int) {
        println(s)
    }
    companion object {
        val instance: KSington4 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            KSington4()
        }
    }
}
//5 静态内部类
class KSington5 private constructor() {
    //kotlin当中没有静态内部类，伴生对象就充当了java中的静态内部类
    companion object {
        val instance=SingtonHolder.holder
    }
    private object SingtonHolder{
        val holder=KSington5()
    }

}

fun main() {
    //KSington就是一个类
    val kSington = KSington
    println(kSington.hashCode())


    //22
    val get = KSington2.get()

    //4
    val kSington4 = KSington4.instance
    kSington4.plus(5)

    //5
    KSington5.instance
}